import {useMemberStore} from '@/stores'

const baseURL='https://pcapi-xiaotuxian-front-devtest.itheima.net'


// 添加拦截器
const httpInterceptor={
    // 拦截前触发
    invoke(options:UniApp.RequestOptions){
        // 非http开头需拼接地址
        if(!options.url.startsWith('http')){
            options.url= baseURL+options.url
        }
        // 请求超时
        options.timeout=10000

        // 小程序请求头
        options.header={
            // 为了避免再传递请求头把之前的覆盖就用...
            ...options.header,
            'source-client': 'miniapp'
        }

        // 添加token请求头标识
        const memberStore = useMemberStore()
        const token = memberStore.profile?.token
        if(token){
            options.header.Authorization = token
        }
    }
}
uni.addInterceptor('request',httpInterceptor )
uni.addInterceptor('uploadFile', httpInterceptor)


// 添加泛型
interface Data<T>{
    code:string,
    msg:string,
    result:T
}
export const http=<T>(options:UniApp.RequestOptions)=>{
    return new Promise<Data<T>>((resolve,reject)=>{
        uni.request({ 
            ...options,
            success(res){
                // 判断状态码
                if(res.statusCode>=200 && res.statusCode <300){
                // 类型断言as
                resolve(res.data as Data<T>)
                }else if(res.statusCode === 401){
                    // 401错误没有携带token->清理用户信息 跳转到登录页
                    const memberStore = useMemberStore()
                    // 调用pinia中清理用户信息的函数
                    memberStore.clearProfile()
                    uni.navigateTo({ url: '/pages/login/login' })
                    reject(res)
                }else{
                    uni.showToast({
                        title: (res.data as Data<T>).msg || '请求错误',
                        icon: 'none',
                        mask: true
                    })
                    reject(res)
                }
            },
            // 响应失败
            fail(err){
                uni.showToast({
                    title:'网络错误，换个网络试试',
                    icon:'none',

                })
                reject(err)
            }
        })
    })
}